package com.example.dao;

import com.example.entity.Review;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 评价数据访问接口
 * @author System
 * @date 2024
 */
public interface ReviewDao {
    
    /**
     * 根据ID查询评价
     * @param id 评价ID
     * @return 评价信息
     */
    Review selectById(Long id);
    
    /**
     * 查询所有评价（包含用户名和商品名）
     * @return 评价列表
     */
    List<Review> selectAllWithDetails();
    
    /**
     * 根据商品ID查询评价
     * @param productId 商品ID
     * @return 评价列表
     */
    List<Review> selectByProductId(Long productId);
    
    /**
     * 根据用户ID查询评价
     * @param userId 用户ID
     * @return 评价列表
     */
    List<Review> selectByUserId(Long userId);
    
    /**
     * 根据状态查询评价
     * @param status 状态
     * @return 评价列表
     */
    List<Review> selectByStatus(Integer status);
    
    /**
     * 根据评分查询评价
     * @param rating 评分
     * @return 评价列表
     */
    List<Review> selectByRating(Integer rating);
    
    /**
     * 分页查询评价
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 评价列表
     */
    List<Review> selectByPage(@Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 根据商品ID分页查询评价
     * @param productId 商品ID
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 评价列表
     */
    List<Review> selectByProductIdWithPage(@Param("productId") Long productId, 
                                          @Param("offset") int offset, 
                                          @Param("limit") int limit);
    
    /**
     * 根据排序方式查询评价
     * @param productId 商品ID
     * @param sortBy 排序方式（newest, oldest, highest, lowest）
     * @return 评价列表
     */
    List<Review> selectByProductIdWithSort(@Param("productId") Long productId, 
                                          @Param("sortBy") String sortBy);
    
    /**
     * 统计评价总数
     * @return 评价总数
     */
    int countAll();
    
    /**
     * 根据商品ID统计评价数
     * @param productId 商品ID
     * @return 评价数量
     */
    int countByProductId(Long productId);
    
    /**
     * 根据用户ID统计评价数
     * @param userId 用户ID
     * @return 评价数量
     */
    int countByUserId(Long userId);
    
    /**
     * 根据状态统计评价数
     * @param status 状态
     * @return 评价数量
     */
    int countByStatus(Integer status);
    
    /**
     * 计算商品平均评分
     * @param productId 商品ID
     * @return 平均评分
     */
    Double getAverageRatingByProductId(Long productId);
    
    /**
     * 统计商品各星级评价数量
     * @param productId 商品ID
     * @param rating 评分
     * @return 评价数量
     */
    int countByProductIdAndRating(@Param("productId") Long productId, 
                                 @Param("rating") Integer rating);
    
    /**
     * 插入评价
     * @param review 评价信息
     * @return 影响行数
     */
    int insert(Review review);
    
    /**
     * 更新评价
     * @param review 评价信息
     * @return 影响行数
     */
    int update(Review review);
    
    /**
     * 更新评价状态
     * @param id 评价ID
     * @param status 状态
     * @return 影响行数
     */
    int updateStatus(@Param("id") Long id, @Param("status") Integer status);
    
    /**
     * 删除评价
     * @param id 评价ID
     * @return 影响行数
     */
    int deleteById(Long id);
    
    /**
     * 根据用户ID删除评价
     * @param userId 用户ID
     * @return 影响行数
     */
    int deleteByUserId(Long userId);
    
    /**
     * 根据商品ID删除评价
     * @param productId 商品ID
     * @return 影响行数
     */
    int deleteByProductId(Long productId);
    
    /**
     * 批量删除评价
     * @param ids 评价ID列表
     * @return 影响行数
     */
    int deleteByIds(@Param("ids") List<Long> ids);
}